package com.zzgc.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import springfox.documentation.schema.ScalarType;
import springfox.documentation.service.*;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;
import java.util.List;

/**
 * Swagger
 *
 * @Author: liglei
 * @CreateTime: 2022-11-16  16:45
 * @Description:
 * @Version: 1.0
 */
@Configuration
@EnableOpenApi // 开启swagger2 3.0.0 用，请求 swagger-ui/index.html
public class SwaggerConfig {

    // 配置了一个swagger的 Docket的bean实例
    @Bean
    public Docket docket(Environment environment) {
        // 判断是测试环境还是生产环境， 是指定的就开启
//        Profiles of = Profiles.of("dev", "test");
//        boolean flag = environment.acceptsProfiles(of);

        //添加head参数start
        List<RequestParameter> singletonList = new ArrayList<RequestParameter>();
        singletonList.add(new springfox.documentation.builders.RequestParameterBuilder()
                // 不能叫Authorization
                .name("token")
                .description("token")
                .in(ParameterType.HEADER)
                .required(true)
                .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
                .build());
        return new Docket(DocumentationType.OAS_30)
                .apiInfo(apiInfo())
                // 是否启动 Swagger， false在网页上访问不了（关闭）
//                .enable(true)
                // 配置项目地址
                //.pathMapping("/vision")
                // 分组
                .groupName("研发组")
                .select()
                // RequestHandlerSelectors: 配置要扫描接口的方法
                // basePackage() : 指定要扫描的包
                // any(): 扫描全部
                // none(): 不扫描
                // withClassAnnotation : 扫描类上的注解， 参数是一个注解的反射对象
                // withMethodAnnotation ： 扫描方法上的注解
                .apis(RequestHandlerSelectors.basePackage("com.zzgc.modules.controller"))
                // paths() : 过滤掉指定路径的, 指的是文件路径不是接口路径
                //.paths(PathSelectors.ant("/controller/*"))
                .build()
                //添加head参数end
                .globalRequestParameters(singletonList);
    }

    // 配置swagger信息 apiInfo
    private ApiInfo apiInfo() {
//        new ApiInfoBuilder().title("李光磊的Swagger文档")
//        .description("事业尚未成功，尔等仍需努力！")
//        .build(); // 可以用这个方式设计
        return new ApiInfo(
                "近视防控(区县)API",
                "事业尚未成功，尔等仍需努力！",
                "V1.0",
                "urn:tos",
                new Contact("李光磊", "http://www.liglei.com:9000", "liglei1026@163.com"),
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }
}
